package com.c2b.algorithm.leetcode.base;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href='https://leetcode.cn/problems/most-frequent-even-element/'>出现最频繁的偶数元素(Most Frequent Even Element)</a>
 * <p>给你一个整数数组 nums ，返回出现最频繁的偶数元素。</p>
 * <p>如果存在多个满足条件的元素，只需要返回 最小 的一个。如果不存在这样的元素，返回 -1 。</p>
 * <p>请你返回 words中 差值整数数组 不同的字符串。</p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 * 示例 1：
 *      输入：nums = [0,1,2,2,4,4,1]
 *      输出：2
 *      解释：
 *          数组中的偶数元素为 0、2 和 4 ，在这些元素中，2 和 4 出现次数最多。
 *          返回最小的那个，即返回 2 。
 *
 * 示例 2：
 *      输入：nums = [4,4,4,9,2,4]
 *      输出：4
 *      解释：4 是出现最频繁的偶数元素。
 *
 * 示例 3：
 *      输入：nums = [29,47,21,41,13,37,25,7]
 *      输出：-1
 *      解释：不存在偶数元素。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>1 <= nums.length <= 2000</li>
 *      <li>0 <= nums[i] <= 10^5</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/23 16:29
 */
public class LC2404MostFrequentEvenElement_S {

    static class Solution {

        public int mostFrequentEven(int[] nums) {
            int[] cnt = new int[1000001];
            int mostFrequent = 0;
            int mostFrequentEven = -1;
            for (int num : nums) {
                // 过滤奇数
                if ((num & 1) == 1) {
                    continue;
                }
                int frequent = ++cnt[num];
                if (frequent > mostFrequent || frequent == mostFrequent && num < mostFrequentEven) {
                    mostFrequent = frequent;
                    mostFrequentEven = num;
                }
            }
            return mostFrequentEven;
        }


        public int mostFrequentEven2(int[] nums) {
            Map<Integer, Integer> frequentMap = new HashMap<>();
            for (int num : nums) {
                if (num % 2 == 0) {
                    frequentMap.put(num, frequentMap.getOrDefault(num, 0) + 1);
                }
            }
            int mostFrequent = 0;
            int mostFrequentEven = -1;
            for (Map.Entry<Integer, Integer> entry : frequentMap.entrySet()) {
                if (entry.getValue() == mostFrequent) {
                    if (mostFrequentEven == -1 || entry.getKey() < mostFrequentEven) {
                        mostFrequentEven = entry.getKey();
                    }
                } else if (entry.getValue() > mostFrequent) {
                    mostFrequent = entry.getValue();
                    mostFrequentEven = entry.getKey();
                }
            }
            return mostFrequentEven;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.mostFrequentEven(new int[]{0, 1, 2, 2, 4, 4, 1}));
        System.out.println(solution.mostFrequentEven(new int[]{4, 4, 4, 9, 2, 4}));
        System.out.println(solution.mostFrequentEven(new int[]{29, 47, 21, 41, 13, 37, 25, 7}));
    }
}
